package com.yaorange.jk.web.sysadmin;

import com.alibaba.fastjson.JSON;
import com.opensymphony.xwork2.ModelDriven;
import com.yaorange.jk.entity.Dept;
import com.yaorange.jk.entity.Module;
import com.yaorange.jk.entity.Role;
import com.yaorange.jk.entity.ZtreeVo;
import com.yaorange.jk.service.DeptService;
import com.yaorange.jk.service.ModuleService;
import com.yaorange.jk.service.RoleService;
import com.yaorange.jk.utils.Pagination;
import com.yaorange.jk.web.BaseAction;
import org.apache.struts2.ServletActionContext;
import org.springframework.beans.factory.annotation.Autowired;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * @author coach tam
 * @date 2017/11/1
 */
public class RoleAction extends BaseAction implements ModelDriven<Role> {

    
    private Role model = new Role();

    //分页对象
    private Pagination page = new Pagination();

    //用户列表
    private List<Role> roleList;
    @Autowired
    private RoleService roleService;
    @Autowired
    private ModuleService moduleService;

    private String jsonStr;

    //当前角色选中的模块ids
    private String  moduleIds;


    /**
     * 分页查询
     */
    public String list() {
        page = roleService.findPage(page.getPageNo(), page.getPageSize());
        page.setUrl("roleAction_list");
        push(page);
        return "list";
    }

    /**
     * 跳转添加页面
     */
    public String tocreate() {

        roleList = roleService.findAll();
        return "tocreate";
    }

    /**
     * 添加
     */
    public String insert() {

        roleService.save(model);
        return "rlist";
    }

    /**
     * 跳转更新页面
     * @return
     */
    public String toupdate() {
        //根据id查询部门老数据
        model = roleService.findById(model.getId());
        //存入栈顶
        push(model);


        return "toupdate";
    }

    /**
     *更新
     */
    public String update() {
        roleService.update(model);
        return "rlist";
    }

    /**
     * 批量删除
     */
    public String delete() {
        String[] ids = model.getId().split(", ");
        roleService.deleteByIds(ids);
        return "rlist";
    }

    public String toview(){
        model = roleService.findById(model.getId());
        push(model);
        return "toview";
    }


//    [
//    { id:2, pId:0, name:"随意勾选 2", checked:true, open:true},
//    { id:21, pId:2, name:"随意勾选 2-1"}
//	  ];

//    /**
//     * mvc
//     * 跳转到分配模块页面
//     * @return
//     */
//    public String tomodule(){

//    model = roleService.findById(model.getId());
//    push(model);
//        //1,查询所有的模块
//        List<Module> moduleList = moduleService.findAll();
//        //2,查询当前角色拥有模块
//        Role role = roleService.findById(model.getId());
//        Set<Module> moduleSet = role.getModuleSet();
//        //3,转成ztree所需json格式字符串
//        StringBuilder sb = new StringBuilder();
//        sb.append("[");
//        //遍历所有的模块
//        for (int i = 0 ;i< moduleList.size();i++)
//        {
//            Module module = moduleList.get(i);
//            //{ id:1, pId:0, name:"随意勾选 2", checked:true, open:true},
//            //拼装每个模块节点,如果不是最后一个节点需要加上  ,
//            sb.append("{");
//            sb.append("id:").append("\"").append(module.getId()).append("\",");
//            sb.append("pId:").append("\"").append(module.getParentId()).append("\",");
//            sb.append("name:").append("\"").append(module.getName()).append("\",");
//            //如果当前角色已经拥有该模块，那么加上 checked:true
//            if(moduleSet.contains(module))
//            {
//                sb.append("checked:").append("true").append(",");
//            }
//            sb.append("open:").append("true");
//            sb.append("}");
//            //判断是否最后一个
//            if(i+1<moduleList.size())
//            {
//                sb.append(",");
//            }
//        }
//        sb.append("]");
//
//        jsonStr = sb.toString();
//
//        return "tomodule";
//    }


    /**
     * ajax
     * 跳转到分配模块页面
     * @return
     */
    public String tomodule(){
        model = roleService.findById(model.getId());
        push(model);
        return "tomodule";
    }

//    /**
//     * 接收ajax请求
//     * @return  返回json字符串
//     */
//    public String roleModuleJsonStr()
//    {
//        //1,查询所有的模块
//        List<Module> moduleList = moduleService.findAll();
//        //2,查询当前角色拥有模块
//        Role role = roleService.findById(model.getId());
//        Set<Module> moduleSet = role.getModuleSet();
//        //3,转成ztree所需json格式字符串
//        StringBuilder sb = new StringBuilder();
//        sb.append("[");
//        //遍历所有的模块
//        for (int i = 0 ;i< moduleList.size();i++)
//        {
//            Module module = moduleList.get(i);
//            //{ id:1, pId:0, name:"随意勾选 2", checked:true, open:true},
//            //拼装每个模块节点,如果不是最后一个节点需要加上  ,
//            sb.append("{");
//            sb.append("id:").append("\"").append(module.getId()).append("\",");
//            sb.append("pId:").append("\"").append(module.getParentId()).append("\",");
//            sb.append("name:").append("\"").append(module.getName()).append("\",");
//            //如果当前角色已经拥有该模块，那么加上 checked:true
//            if(moduleSet.contains(module))
//            {
//                sb.append("checked:").append("true").append(",");
//            }
//            sb.append("open:").append("true");
//            sb.append("}");
//            //判断是否最后一个
//            if(i+1<moduleList.size())
//            {
//                sb.append(",");
//            }
//        }
//        sb.append("]");
//
//        jsonStr = sb.toString();
//
//
//        //通过response打印json
//        try {
//            HttpServletResponse response = ServletActionContext.getResponse();
//            response.setContentType("text/html;charset=utf-8");
//            PrintWriter out = response.getWriter();
//
//            out.write(jsonStr);
//            out.flush();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        return NONE;
//    }


    /**
     * 接收ajax请求
     * @return  返回json字符串(通过fastjson)
     */
    public String roleModuleJsonStr()
    {
        //1,查询所有的模块
        List<Module> moduleList = moduleService.findAll();
        //2,查询当前角色拥有模块
        Role role = roleService.findById(model.getId());
        Set<Module> moduleSet = role.getModuleSet();


        //3,转成ztree所需json格式字符串
        //将moduleList -->ztreeSet
        Set<ZtreeVo> ztreeVoSet = new HashSet<>(moduleList.size());
        //遍历所有的模块
        for (int i = 0 ;i< moduleList.size();i++)
        {
            Module module = moduleList.get(i);

            //将module-->ztreeVo
            ZtreeVo ztreeVo = new ZtreeVo(module.getId(),module.getParentId(),module.getName(),false,true);
            if(moduleSet.contains(module))
            {
                ztreeVo.setChecked(true);
            }
            ztreeVoSet.add(ztreeVo);
        }

        //将ztreeVoSet-->json字符串
        jsonStr = JSON.toJSONString(ztreeVoSet);


        //通过response打印json
        try {
            HttpServletResponse response = ServletActionContext.getResponse();
            response.setContentType("text/html;charset=utf-8");
            PrintWriter out = response.getWriter();

            out.write(jsonStr);
            out.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return NONE;
    }

    /**
     * 更新角色模块
     * @return
     */
    public String module(){
        //获取moduleIds
        //将moduleIds-->数组
        String[]  a_moduleIds = moduleIds.split(",");
        //将数组-->Set
        Set<Module> moduleSet = new HashSet<>(a_moduleIds.length);
        for (String mid:a_moduleIds)
        {
            //通过mid查询到对应module对象
            Module module = moduleService.findById(mid);
            //将module对象放入moduleSet
            moduleSet.add(module);
        }
        //更新当前角色模块
        Role role = roleService.findById(model.getId());
        role.setModuleSet(moduleSet);

        roleService.updateModule(role);

       return "rlist";

    }
    public void setPage(Pagination page) {
        this.page = page;
    }

    public List<Role> getRoleList() {
        return roleList;
    }

    public String getJsonStr() {
        return jsonStr;
    }

    public void setModuleIds(String moduleIds) {
        this.moduleIds = moduleIds;
    }

    @Override
    public Role getModel() {
        return model;
    }
}
